{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Using pandasGEXpress with .gct/x files \n",
    "\n",
    "--------------------------------------------------------------------------------\n",
    "## A sample tutorial using data from [GEO GSE70138](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE70138)\n",
    "\n",
    "Author: Oana Enache\n",
    "\n",
    "Last updated March 13th, 2018\n",
    "\n",
    "For questions and issue reports, please file an issue at github.com/cmap/cmapPy. \n",
    "\n",
    "--------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Table of Contents\n",
    "\n",
    "We have developed this tutorial to loosely follow a workflow we recommend for .gct/x files downloaded from GEO GSE70138. \n",
    "\n",
    "[Background info](#background)\n",
    "\n",
    "[Obtaining data from GEO](#getdata)\n",
    "\n",
    "[Activate your conda environment](#conda)\n",
    "\n",
    "[Parse in metadata only](#metadataparse)\n",
    "\n",
    "[Parsing in a gct/x file](#parsegctx)\n",
    "\n",
    "[Add/delete annotations](#annotations)\n",
    "\n",
    "[Subsetting gct/x files and GCToo instances](#subsetting)\n",
    "\n",
    "[Merging gct/x files](#merging)\n",
    "\n",
    "[Construct a GCToo instance](#newGCToo)\n",
    "\n",
    "[Using GCToo instances with pandas tools](#pandas)\n",
    "\n",
    "[Plotting with GCToo objects](#plotting)\n",
    "\n",
    "[Write a GCToo instance to file](#writing)\n",
    "\n",
    "[Converting .gct <-> .gctx](#converting)\n",
    "\n",
    "--------------------------------------------------------------------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"background\"></a>\n",
    "\n",
    "\n",
    "## Background: What's .gct, .gctx, and GCToo? \n",
    "\n",
    "For more details on each of these topics, please visit clue.io/code. \n",
    "\n",
    "\n",
    "### The .gct format \n",
    "\n",
    "![Sample GCT file](GCT_mockup.png)\n",
    "\n",
    "The GCT file format, a tab-delimited text-based format pairing matrix expression values with row and column metadata, allowing comparison of both transcriptional and contextual differences across samples. A schematic of a sample GCT file is pictured above. \n",
    "\n",
    "### The .gctx format\n",
    "\n",
    "![Sample GCTX file](GCTX_mockup.png)\n",
    "\n",
    "The GCTX file format was developed to improve serialization performance of GCT, particularly for large files. GCTX is an HDF5-based data format that can contain the same content as one or more GCT files in a hierarchically-structured, compressed, and easily accessible form (full file specification available at clue.io/code). Amongst other features, the HDF5 format allows users the ability to parse a subset of a large data set without reading the entire data set into memory first (using hyperslab selection). A schematic of a sample GCTX file is pictured above.\n",
    "\n",
    "### The GCToo object \n",
    "\n",
    "`GCToo` objects are instances of the GCToo class we developed to represent .gct and .gctx files in a form compatible with Python's [PANDAS](http://pandas.pydata.org/) library. In essence, GCToo is a container of 3 pandas DataFrames (optionally, can also include a multi-index DataFrame of these 3 DataFrames combined) as well as two attributes representing the file source and version respectively. For more information, please see [our documentation](https://clue.io/cmapPy/pandasGEXpress.html#gctoo-class). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"getdata\"></a>\n",
    "## Obtaining Data from Gene Expression Omnibus (GEO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Gene Expression Omnibus](https://www.ncbi.nlm.nih.gov/geo/), or GEO, is a NCBI-maintained public repository of array and sequence genomics data. As of April 2017, we have provided 1.7 million profiles to GEO at the following accessions:\n",
    "\n",
    "* [GSE70138](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE70138)\n",
    "\n",
    "* [GSE92742](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE92742)\n",
    "\n",
    "* [GSE92743](https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE92743)\n",
    "\n",
    "Please note that this does not represent the only data available in .gct and .gctx format; we simply mention it as a public resource for freely available data in these formats, and will use it as an example in this tutorial. \n",
    "\n",
    "Data can be downloaded from GEO using either using FTP or HTTP; see accession pages above for details. Details on what content is within each file published is clarified in the [GEO User Guide](https://docs.google.com/document/d/1q2gciWRhVCAAnlvF2iRLuJ7whrGP6QjpsCMq1yWz7dU/edit?usp=sharing). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"conda\"></a>\n",
    "## Activate your cmapPy conda environment \n",
    "\n",
    "If you haven't done so already, [create a conda environment to use for your analyses](https://clue.io/cmapPy/build.html#install).\n",
    "\n",
    "For this example, we've named our conda environment ``my_cmapPy_env``. \n",
    "\n",
    "**Be sure to activate your environment before proceeding!**\n",
    "\n",
    "``source activate my_cmapPy_env``\n",
    "\n",
    "### What version of cmapPy does this tutorial use? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'3.1.1'"
      ]
     },
     "execution_count": 81,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "import pkg_resources\n",
    "\n",
    "# Print version of cmapPy being used in current conda environment \n",
    "pkg_resources.get_distribution(\"cmapPy\").version"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"metadataparse\"></a>\n",
    "## Parse in metadata only \n",
    "\n",
    "Although we are in the process of developing tools to provide out of core functionality for larger that memory .gctx files, for now some .gctx files may be larger than the RAM you have available on your computer (note, we do not recommend the use of .gct for files above ~1000 samples). If this is the case, you have two options:\n",
    "\n",
    "    1. Obtain access to a server/instance that has more RAM. \n",
    "    2. Read the metadata in first, find the sample (column) id values (\"cids\") that you're actually interested in, and only parse those cids in. \n",
    "\n",
    "### How to parse in metadata only from GEO\n",
    "\n",
    "This would be applicable if you were interested in only certain samples (or certain compound names, cell types, etc). Here, we parse in the metadata from the level 5 (replicate-collapsed signature) data on GSE70138.\n",
    "\n",
    "#### Sample (column) annotations \n",
    "\n",
    "On GEO, because of submission requirements annotations file are stored as separate tab-delimited text files. For level 5 data, we're interested in the \"sig\" related data tables. For this example, we previously downloaded and unzipped \"GSE70138_Broad_LINCS_sig_info_2017-03-06.txt.gz\" (corresponding to identifying information about the samples; if you wanted metrics-related information for filtering, explore the equivalently labelled \"sig metrics\" file). \n",
    "\n",
    "Then, we read this in to a pandas DataFrame: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "sig_info = pd.read_csv(\"GSE70138_Broad_LINCS_sig_info_2017-03-06.txt\", sep=\"\\t\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index([u'sig_id', u'pert_id', u'pert_iname', u'pert_type', u'cell_id',\n",
       "       u'pert_idose', u'pert_itime', u'distil_id'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 83,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# look at the metadata fields provided \n",
    "sig_info.columns"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As an illustrative example, say we're only interested in looking at expression data corresponding to cells treated as vorinostat. So, we first want to find the sig_id values that correspond to vorinostat-treated samples:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of samples treated with vorinostat:\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "210"
      ]
     },
     "execution_count": 84,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# get all samples (across all cell types, doses, and other treatment conditions) that were treated with vorinostat\n",
    "vorinostat_ids = sig_info[\"sig_id\"][sig_info[\"pert_iname\"] == \"vorinostat\"]\n",
    "# how many samples are there in this data set?\n",
    "print(\"number of samples treated with vorinostat:\")\n",
    "len(vorinostat_ids)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Gene (row) annotations \n",
    "\n",
    "Analogously, you might be interested in only parsing in a specific row space; for example, you might be interested at only only examining patterns in expression of [landmark genes](https://clue.io/connectopedia/what_are_landmark_genes). The metadata column identifying landmark membership is `pr_is_lm` (for more details on other metadata header meanings, please see the [GEO User Guide](https://docs.google.com/document/d/1q2gciWRhVCAAnlvF2iRLuJ7whrGP6QjpsCMq1yWz7dU/edit#heading=h.l6bq0r1aih50)). \n",
    "\n",
    "So, we would parse in the gene annotations and obtain a list of only the row identifiers corresponding to landmark genes. **Note that for Entrez ids (as below), you need to specify that the data type annotations are strings (dtype=str argument below); otherwise, the parser currently behaves as if you're subsetting by index.** "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index([u'pr_gene_id', u'pr_gene_symbol', u'pr_gene_title', u'pr_is_lm',\n",
       "       u'pr_is_bing'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 85,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "gene_info = pd.read_csv(\"GSE70138_Broad_LINCS_gene_info_2017-03-06.txt\", sep=\"\\t\", dtype=str)\n",
    "gene_info.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "# again, note that because gene_info dtypes are str, you need to find ids equal to \"1\" not 1 \n",
    "landmark_gene_row_ids = gene_info[\"pr_gene_id\"][gene_info[\"pr_is_lm\"] == \"1\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once you have the row and/or column identifiers you're interested in, parse only these ids from the GCTX file (see [Parse in a gctx](#parsegctx) below). "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Side note: How to parse in metadata only from a metadata-annotated gctx\n",
    "\n",
    "Note. *This is not specifically relevant to the data available on GEO*, but if you have a .gctx file with row/column annotations and want to only look at the metadata annotations, you can also read only these fields in from the gctx. You would do this as follows:\n",
    "\n",
    "``from cmapPy.pandasGEXpress.parse import parse`` \n",
    "\n",
    "``gctx_metadata_only = parse(\"path/to/gctx.gctx\", metadata_only=True)``"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>chd</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cid</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>REP.A001_A375_24H:A03</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REP.A001_A375_24H:A04</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REP.A001_A375_24H:A05</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REP.A001_A375_24H:A06</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REP.A001_A375_24H:A07</th>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "from cmapPy.pandasGEXpress.parse import parse\n",
    "\n",
    "my_col_metadata = parse(\"GSE70138_Broad_LINCS_Level5_COMPZ_n118050x12328_2017-03-06.gctx\", col_meta_only=True)\n",
    "my_col_metadata[0:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"parsegctx\"></a>\n",
    "# Parse in a gctx\n",
    "\n",
    "Now we're ready to read in expression data! For parsing, here are your options:\n",
    "\n",
    "1. Read in an entire gctx file\n",
    "2. Read in a subset of ids \n",
    "\n",
    "Generally, we recommend choice 2. \n",
    "\n",
    "## Example 1: Parse in a subset of samples/columns \n",
    "\n",
    "We'll demonstrate how to do so here using the ``vorinostat_ids`` we obtained [in the previous section](#metadataparse). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [],
   "source": [
    "from cmapPy.pandasGEXpress.parse import parse\n",
    "vorinostat_only_gctoo = parse(\"GSE70138_Broad_LINCS_Level5_COMPZ_n118050x12328_2017-03-06.gctx\", cid=vorinostat_ids)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(12328, 210)"
      ]
     },
     "execution_count": 89,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# Check to make sure we have all 210 colums of expression data: \n",
    "vorinostat_only_gctoo.data_df.shape #yup!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example 2: Parse in a subset of genes/rows\n",
    "\n",
    "We'll demonstrate how to do so here using the ``landmark_gene_row_ids`` we obtained [in the previous section](#metadataparse). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": [
    "landmark_only_gctoo = parse(\"GSE70138_Broad_LINCS_Level5_COMPZ_n118050x12328_2017-03-06.gctx\", rid = landmark_gene_row_ids)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(978, 118050)"
      ]
     },
     "execution_count": 91,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# Check to make sure we only have 978 rows of expression data: \n",
    "landmark_only_gctoo.data_df.shape #yup!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notes:\n",
    "\n",
    "* If you did want to read in the entire file (option 1 above), you would just parse in the gct/x without the ``cid`` argument.\n",
    "* Subsetting as demonstrated above is also available for row ids (rids). Here, this would correspond to only looking at certain genes of interest. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"annotations\"></a>\n",
    "## Add/delete annotations to an existing GCToo instance \n",
    "\n",
    "### Adding annotations\n",
    "Now we have our sig_id annotations, and also a GCToo instance of expression data. This would probably be more useful to us as one unified object, so let's annotate our `vorinostat_only_gctoo` with the id information relevant to it: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sig_id</th>\n",
       "      <th>pert_id</th>\n",
       "      <th>pert_iname</th>\n",
       "      <th>pert_type</th>\n",
       "      <th>cell_id</th>\n",
       "      <th>pert_idose</th>\n",
       "      <th>pert_itime</th>\n",
       "      <th>distil_id</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>15923</th>\n",
       "      <td>LJP007_A375_24H:A03</td>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>trt_cp</td>\n",
       "      <td>A375</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_A375_24H_X1_B20:A03|LJP007_A375_24H_X2_...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16302</th>\n",
       "      <td>LJP007_A549_24H:A03</td>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>trt_cp</td>\n",
       "      <td>A549</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_A549_24H_X1_F1B19:A03|LJP007_A549_24H_X...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16681</th>\n",
       "      <td>LJP007_ASC.C_24H:A03</td>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>trt_cp</td>\n",
       "      <td>ASC.C</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_ASC.C_24H_X1_B21:A03|LJP007_ASC.C_24H_X...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17056</th>\n",
       "      <td>LJP007_ASC_24H:A03</td>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>trt_cp</td>\n",
       "      <td>ASC</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_ASC_24H_X1_B21:A03|LJP007_ASC_24H_X2.A2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17432</th>\n",
       "      <td>LJP007_CD34_24H:A03</td>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>trt_cp</td>\n",
       "      <td>CD34</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_CD34_24H_X2_B21:A03|LJP007_CD34_24H_X3....</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# first, we need to subset all the metadata information from our larger metadata DataFrame\n",
    "vorinostat_sig_id_info =  sig_info[sig_info[\"pert_iname\"] == \"vorinostat\"]\n",
    "# let's look at a couple rows! \n",
    "vorinostat_sig_id_info[0:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index([u'LJP007_A375_24H:A03', u'LJP007_A549_24H:A03', u'LJP007_ASC.C_24H:A03',\n",
       "       u'LJP007_ASC_24H:A03', u'LJP007_CD34_24H:A03', u'LJP007_HA1E_24H:A03',\n",
       "       u'LJP007_HCC515_24H:A03', u'LJP007_HEPG2_24H:A03',\n",
       "       u'LJP007_HME1_24H:A03', u'LJP007_HT29_24H:A03',\n",
       "       ...\n",
       "       u'LPROT003_A375_6H:P12', u'LPROT003_A549_6H:O08',\n",
       "       u'LPROT003_A549_6H:O10', u'LPROT003_A549_6H:O12',\n",
       "       u'LPROT003_NPC_6H:P07', u'LPROT003_NPC_6H:P09', u'LPROT003_NPC_6H:P11',\n",
       "       u'LPROT003_PC3_6H:O07', u'LPROT003_PC3_6H:O09', u'LPROT003_PC3_6H:O11'],\n",
       "      dtype='object', name=u'sig_id', length=210)"
      ]
     },
     "execution_count": 93,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# to add this data as our col_metadata_df, \n",
    "# the sig_id column needs to be the index of the metadata DataFrame\n",
    "# For details on why this is, please refer to GCTX requirements: https://clue.io/connectopedia/gctx_format\n",
    "vorinostat_sig_id_info.set_index(\"sig_id\", inplace=True)\n",
    "# now the data frame is indexed by sig_ids consistent with those of the data_df:\n",
    "vorinostat_sig_id_info.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "# set the relevant annotations as a col_metadata_df: \n",
    "vorinostat_only_gctoo.col_metadata_df = vorinostat_sig_id_info"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Deleting Annotations \n",
    "\n",
    "Hm, but now that we look at it we probably don't need the \"pert_type\" field; since we're only looking at vorinostat data, it's \"trt_cp\" (compound) for all samples. We could keep it anyway, but just for fun let's delete it: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pert_id</th>\n",
       "      <th>pert_iname</th>\n",
       "      <th>cell_id</th>\n",
       "      <th>pert_idose</th>\n",
       "      <th>pert_itime</th>\n",
       "      <th>distil_id</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>LJP007_ASC_24H:A03</th>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>ASC</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_ASC_24H_X1_B21:A03|LJP007_ASC_24H_X2.A2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LJP007_HUES3_24H:A03</th>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>HUES3</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_HUES3_24H_X2_B24:A03|LJP007_HUES3_24H_X...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LJP007_MNEU.E_24H:A03</th>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>MNEU.E</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_MNEU.E_24H_X1_B24:A03|LJP007_MNEU.E_24H...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LJP007_NEU_24H:A03</th>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>NEU</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_NEU_24H_X1_B21:A03|LJP007_NEU_24H_X2_B2...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LJP007_NPC.CAS9_24H:A03</th>\n",
       "      <td>BRD-K81418486</td>\n",
       "      <td>vorinostat</td>\n",
       "      <td>NPC.CAS9</td>\n",
       "      <td>10.0 um</td>\n",
       "      <td>24 h</td>\n",
       "      <td>LJP007_NPC.CAS9_24H_X1_B21:A03|LJP007_NPC.CAS9...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "del vorinostat_only_gctoo.col_metadata_df[\"pert_type\"]\n",
    "vorinostat_only_gctoo.col_metadata_df[0:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"subsetting\"></a> \n",
    "## Subsetting GCToo instances \n",
    "\n",
    "Let's say that we're actually only interested in looking at vorinostat's signatures in A375 cells. First, are there vorinostat samples treated in this cell line in this GCToo instance? Let's check by first listing all unique cell lines present: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['ASC', 'HUES3', 'MNEU.E', 'NEU', 'NPC.CAS9', 'NPC', 'SKL', 'A375',\n",
       "       'A549', 'PC3', 'ASC.C', 'CD34', 'HA1E', 'HCC515', 'HEPG2', 'HME1',\n",
       "       'HT29', 'HUVEC', 'JURKAT', 'MCF7', 'NPC.TAK', 'SKL.C'], dtype=object)"
      ]
     },
     "execution_count": 96,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "vorinostat_only_gctoo.col_metadata_df[\"cell_id\"].unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's subset our GCToo instance to only include samples/columns corresponding to vorinostat-treated A375 cells."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['A375'], dtype=object)"
      ]
     },
     "execution_count": 97,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "import cmapPy.pandasGEXpress.subset_gctoo as sg\n",
    "\n",
    "# first, get the cid values we want to keep \n",
    "vorinostat_a375_ids = vorinostat_only_gctoo.col_metadata_df.index[vorinostat_only_gctoo.col_metadata_df[\"cell_id\"] == \"A375\"]\n",
    "\n",
    "# subset GCToo instance to only include these values \n",
    "vorinostat_a375_gctoo = sg.subset_gctoo(vorinostat_only_gctoo, cid=vorinostat_a375_ids)\n",
    "\n",
    "# Now, our samples only correspond to one cell type: A375\n",
    "vorinostat_a375_gctoo.col_metadata_df[\"cell_id\"].unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that you can also subset by excluding rids/cids. For instance, if we wanted to include all cell lines **except** for A375, we could do so as follows: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['ASC', 'HUES3', 'MNEU.E', 'NEU', 'NPC.CAS9', 'NPC', 'SKL', 'A549',\n",
       "       'PC3', 'ASC.C', 'CD34', 'HA1E', 'HCC515', 'HEPG2', 'HME1', 'HT29',\n",
       "       'HUVEC', 'JURKAT', 'MCF7', 'NPC.TAK', 'SKL.C'], dtype=object)"
      ]
     },
     "execution_count": 98,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "# subset vorinostat_only_gctoo to exclude A375 samples only\n",
    "vorinostat_except_a375_gctoo = sg.subset_gctoo(vorinostat_only_gctoo, exclude_cid=vorinostat_a375_ids)\n",
    "\n",
    "# Now we have all cell lines except for A375: \n",
    "vorinostat_except_a375_gctoo.col_metadata_df[\"cell_id\"].unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You could subset genes/rows of the GCToo analogously. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a link=\"merging\"></a>\n",
    "## Merging GCToo objects/.gct/.gctx files \n",
    "\n",
    "If you'd like to concatenate two or more objects/files, you have two options: \n",
    "\n",
    "1. Concatenate files from the command line \n",
    "2. Concatenate GCToo objects within a Python session. \n",
    "\n",
    "To continue with our GEO-based example, here we'll demonstrate option 2; for details on how to concatenate on the command line, please see [our documentation](https://clue.io/cmapPy/pandasGEXpress.html).\n",
    "\n",
    "### Concatenating GCToo objects in a Python session \n",
    "\n",
    "We have our vorinostat expression data in A375; let's say we want to also get belinostat expression data in A375 (separately, for purposes of demonstration) and then combine these two GCToos. First, some prep: let's get the belinostat expression data in A375 that we need to do this operation: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "# get sig info corresponding to belinostat-treated A375 samples\n",
    "belinostat_a375_sig_info = sig_info[(sig_info[\"pert_iname\"] == \"belinostat\") & (sig_info[\"cell_id\"] == \"A375\")]\n",
    "# set sig_id as index \n",
    "belinostat_a375_sig_info.set_index(\"sig_id\", inplace=True)\n",
    "# parse in only expression data corresponding to belinostat-treated A375 samples\n",
    "belinostat_a375_gctoo = parse(\"GSE70138_Broad_LINCS_Level5_COMPZ_n118050x12328_2017-03-06.gctx\", cid=belinostat_a375_sig_info.index)\n",
    "# annotate belinostat_a375_gctoo with its corresponding sample annotations\n",
    "belinostat_a375_gctoo.col_metadata_df = belinostat_a375_sig_info.copy()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now we can concatenate our belinostat & vorinostat GCToos as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "unique compound data present: \n",
      "['vorinostat' 'belinostat']\n",
      "unique cell line data present: \n",
      "['A375']\n",
      "combined gctoo expression data shape:\n",
      "(12328, 33)\n"
     ]
    }
   ],
   "source": [
    "import cmapPy.pandasGEXpress.concat as cg \n",
    "# horizontally stack the two GCToo instances (note, you can also vertically stack)\n",
    "HDAC_a375_gctoo = cg.hstack([vorinostat_a375_gctoo, belinostat_a375_gctoo])\n",
    "\n",
    "# Now we have a gctoo corresponding to two compounds, in one cell line: \n",
    "print(\"unique compound data present: \") \n",
    "print(HDAC_a375_gctoo.col_metadata_df[\"pert_iname\"].unique())\n",
    "print(\"unique cell line data present: \")\n",
    "print(HDAC_a375_gctoo.col_metadata_df[\"cell_id\"].unique())\n",
    "\n",
    "# Also note we still have the same genes as before, just with additional samples of data: \n",
    "print(\"combined gctoo expression data shape:\")\n",
    "print(HDAC_a375_gctoo.data_df.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Concatenating two .gct/x files on the command line\n",
    "\n",
    "We provide the command line tool `concat` to concatenate either .gcts or .gctx files on the command line. \n",
    "\n",
    "Sample usage: \n",
    "\n",
    "` concat--concat_direction horiz --input_filepaths first_file.gct second_file.gct` will output a file named concated.gctx; you can specify a different outname if you prefer. On the command line, type `concat -h` to see help options. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"newGCToo\"></a>\n",
    "## Constructing a new GCToo instance programatically \n",
    "\n",
    "If you have your own DataFrames of data, you can also construct your own GCToo instance (note that to do so, you need to fulfill the [requirements of a valid gctx](clue.io/code)). Just for illustrative purposes, let's make one using copies of our HDAC GCToo DataFrames, so that we can also associate a single [multi-index DataFrame](http://pandas.pydata.org/pandas-docs/stable/advanced.html) of our combined data_df, row_metadata_df, and column_data_df with this GCToo instance. \n",
    "\n",
    "**Note**: By default, the GCToo constructor does not make a multi_index_df; details on this and other optional arguments [here](http://cmappy.readthedocs.io/en/latest/pandasGEXpress.html#gctoo-class)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th>cell_id</th>\n",
       "      <th colspan=\"21\" halign=\"left\">A375</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>distil_id</th>\n",
       "      <th>LJP007_A375_24H_X1_B20:A03|LJP007_A375_24H_X2_B20:A03|LJP007_A375_24H_X3_B20:A03</th>\n",
       "      <th>LJP008_A375_24H_X2_B20:A03</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:G07|LJP008_A375_24H_X2_B20:G07|LJP008_A375_24H_X3_B20:G07</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:G08|LJP008_A375_24H_X2_B20:G08|LJP008_A375_24H_X3_B20:G08</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:G09|LJP008_A375_24H_X2_B20:G09|LJP008_A375_24H_X3_B20:G09</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:G10|LJP008_A375_24H_X2_B20:G10|LJP008_A375_24H_X3_B20:G10</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:G11|LJP008_A375_24H_X2_B20:G11|LJP008_A375_24H_X3_B20:G11</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:G12|LJP008_A375_24H_X2_B20:G12|LJP008_A375_24H_X3_B20:G12</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:L19|LJP008_A375_24H_X2_B20:L19|LJP008_A375_24H_X3_B20:L19</th>\n",
       "      <th>LJP008_A375_24H_X1_B20:L20|LJP008_A375_24H_X3_B20:L20</th>\n",
       "      <th>...</th>\n",
       "      <th>LPROT002_A375_6H_X1_B22:P11</th>\n",
       "      <th>LPROT003_A375_6H_X1.A2_B22:P08</th>\n",
       "      <th>LPROT003_A375_6H_X1.A2_B22:P10</th>\n",
       "      <th>LPROT003_A375_6H_X1.A2_B22:P12</th>\n",
       "      <th>REP.A002_A375_24H_X1_B22:L19|REP.A002_A375_24H_X2_B22:L19|REP.A002_A375_24H_X3_B22:L19</th>\n",
       "      <th>REP.A002_A375_24H_X1_B22:L20|REP.A002_A375_24H_X2_B22:L20|REP.A002_A375_24H_X3_B22:L20</th>\n",
       "      <th>REP.A002_A375_24H_X1_B22:L21|REP.A002_A375_24H_X3_B22:L21</th>\n",
       "      <th>REP.A002_A375_24H_X1_B22:L22|REP.A002_A375_24H_X2_B22:L22|REP.A002_A375_24H_X3_B22:L22</th>\n",
       "      <th>REP.A002_A375_24H_X1_B22:L23|REP.A002_A375_24H_X2_B22:L23|REP.A002_A375_24H_X3_B22:L23</th>\n",
       "      <th>REP.A002_A375_24H_X1_B22:L24|REP.A002_A375_24H_X2_B22:L24|REP.A002_A375_24H_X3_B22:L24</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pert_id</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>...</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K81418486</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "      <th>BRD-K17743125</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pert_idose</th>\n",
       "      <th>10.0 um</th>\n",
       "      <th>10.0 um</th>\n",
       "      <th>10.0 um</th>\n",
       "      <th>3.33 um</th>\n",
       "      <th>1.11 um</th>\n",
       "      <th>0.37 um</th>\n",
       "      <th>0.12 um</th>\n",
       "      <th>0.04 um</th>\n",
       "      <th>10.0 um</th>\n",
       "      <th>3.33 um</th>\n",
       "      <th>...</th>\n",
       "      <th>1.0 um</th>\n",
       "      <th>1.0 um</th>\n",
       "      <th>1.0 um</th>\n",
       "      <th>1.0 um</th>\n",
       "      <th>10.0 um</th>\n",
       "      <th>3.33 um</th>\n",
       "      <th>1.11 um</th>\n",
       "      <th>0.37 um</th>\n",
       "      <th>0.12 um</th>\n",
       "      <th>0.04 um</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pert_iname</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>...</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>vorinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>belinostat</th>\n",
       "      <th>belinostat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pert_itime</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>...</th>\n",
       "      <th>6 h</th>\n",
       "      <th>6 h</th>\n",
       "      <th>6 h</th>\n",
       "      <th>6 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "      <th>24 h</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pert_type</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>...</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>NaN</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>trt_cp</th>\n",
       "      <th>trt_cp</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cid</th>\n",
       "      <th>LJP007_A375_24H:A03</th>\n",
       "      <th>LJP008_A375_24H:A03</th>\n",
       "      <th>LJP008_A375_24H:G07</th>\n",
       "      <th>LJP008_A375_24H:G08</th>\n",
       "      <th>LJP008_A375_24H:G09</th>\n",
       "      <th>LJP008_A375_24H:G10</th>\n",
       "      <th>LJP008_A375_24H:G11</th>\n",
       "      <th>LJP008_A375_24H:G12</th>\n",
       "      <th>LJP008_A375_24H:L19</th>\n",
       "      <th>LJP008_A375_24H:L20</th>\n",
       "      <th>...</th>\n",
       "      <th>LPROT002_A375_6H:P11</th>\n",
       "      <th>LPROT003_A375_6H:P08</th>\n",
       "      <th>LPROT003_A375_6H:P10</th>\n",
       "      <th>LPROT003_A375_6H:P12</th>\n",
       "      <th>REP.A002_A375_24H:L19</th>\n",
       "      <th>REP.A002_A375_24H:L20</th>\n",
       "      <th>REP.A002_A375_24H:L21</th>\n",
       "      <th>REP.A002_A375_24H:L22</th>\n",
       "      <th>REP.A002_A375_24H:L23</th>\n",
       "      <th>REP.A002_A375_24H:L24</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.008059</td>\n",
       "      <td>0.0304</td>\n",
       "      <td>0.461959</td>\n",
       "      <td>-0.190508</td>\n",
       "      <td>0.551420</td>\n",
       "      <td>-0.678830</td>\n",
       "      <td>0.031829</td>\n",
       "      <td>-0.301056</td>\n",
       "      <td>0.992680</td>\n",
       "      <td>-0.73895</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0822</td>\n",
       "      <td>-0.0186</td>\n",
       "      <td>0.8468</td>\n",
       "      <td>1.0998</td>\n",
       "      <td>0.264026</td>\n",
       "      <td>-0.307432</td>\n",
       "      <td>-0.41890</td>\n",
       "      <td>-0.102725</td>\n",
       "      <td>-0.102623</td>\n",
       "      <td>0.612571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.573452</td>\n",
       "      <td>1.4759</td>\n",
       "      <td>1.489562</td>\n",
       "      <td>-0.442627</td>\n",
       "      <td>-0.095436</td>\n",
       "      <td>-0.181469</td>\n",
       "      <td>0.495024</td>\n",
       "      <td>-0.435680</td>\n",
       "      <td>2.483659</td>\n",
       "      <td>0.86220</td>\n",
       "      <td>...</td>\n",
       "      <td>0.6853</td>\n",
       "      <td>2.3457</td>\n",
       "      <td>0.9870</td>\n",
       "      <td>1.9079</td>\n",
       "      <td>1.642888</td>\n",
       "      <td>1.838086</td>\n",
       "      <td>-0.05215</td>\n",
       "      <td>-0.633294</td>\n",
       "      <td>-0.451341</td>\n",
       "      <td>-0.567183</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.450470</td>\n",
       "      <td>0.0818</td>\n",
       "      <td>-0.411553</td>\n",
       "      <td>0.464197</td>\n",
       "      <td>0.364813</td>\n",
       "      <td>0.817661</td>\n",
       "      <td>0.420261</td>\n",
       "      <td>0.737214</td>\n",
       "      <td>-1.015596</td>\n",
       "      <td>0.92430</td>\n",
       "      <td>...</td>\n",
       "      <td>0.6831</td>\n",
       "      <td>0.4102</td>\n",
       "      <td>-0.5727</td>\n",
       "      <td>-1.4457</td>\n",
       "      <td>-2.914757</td>\n",
       "      <td>-1.699599</td>\n",
       "      <td>-1.31215</td>\n",
       "      <td>0.842127</td>\n",
       "      <td>0.517710</td>\n",
       "      <td>-0.452705</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-2.455962</td>\n",
       "      <td>-2.5684</td>\n",
       "      <td>-2.092667</td>\n",
       "      <td>-0.278474</td>\n",
       "      <td>-0.184746</td>\n",
       "      <td>-0.437475</td>\n",
       "      <td>0.083283</td>\n",
       "      <td>0.536201</td>\n",
       "      <td>-2.461447</td>\n",
       "      <td>-1.14960</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.0311</td>\n",
       "      <td>1.1298</td>\n",
       "      <td>-0.6249</td>\n",
       "      <td>0.4028</td>\n",
       "      <td>-4.058307</td>\n",
       "      <td>-1.900123</td>\n",
       "      <td>-1.03950</td>\n",
       "      <td>0.330838</td>\n",
       "      <td>0.363351</td>\n",
       "      <td>-1.214370</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.479968</td>\n",
       "      <td>0.8226</td>\n",
       "      <td>-0.877457</td>\n",
       "      <td>0.535701</td>\n",
       "      <td>0.172798</td>\n",
       "      <td>0.598544</td>\n",
       "      <td>0.007183</td>\n",
       "      <td>1.303366</td>\n",
       "      <td>-0.019059</td>\n",
       "      <td>-1.23355</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.2998</td>\n",
       "      <td>0.4132</td>\n",
       "      <td>0.6875</td>\n",
       "      <td>-1.8015</td>\n",
       "      <td>0.094338</td>\n",
       "      <td>-1.425455</td>\n",
       "      <td>-0.59310</td>\n",
       "      <td>-0.093257</td>\n",
       "      <td>0.381632</td>\n",
       "      <td>-1.183725</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 33 columns</p>\n",
       "</div>"
      ]
     },
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "import cmapPy.pandasGEXpress.GCToo as GCToo\n",
    "\n",
    "HDAC_a375_gctoo_with_multiindex = GCToo.GCToo(data_df=HDAC_a375_gctoo.data_df.copy(), \n",
    "                                              row_metadata_df=HDAC_a375_gctoo.row_metadata_df.copy(), \n",
    "                                              col_metadata_df=HDAC_a375_gctoo.col_metadata_df.copy(), \n",
    "                                             make_multiindex=True)\n",
    "\n",
    "# Let's take a look at a subset of this multiindex DataFrame; this can be useful for indexing etc.\n",
    "HDAC_a375_gctoo_with_multiindex.multi_index_df[0:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For more information on multi-index DataFrames, please refer to the PANDAS project documentation. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a link=\"pandas\"></a>\n",
    "## Using pandas tools with your GCToo instance \n",
    "\n",
    "A big reason why we wrote `pandasGEXpress` was to enable users to maximize their use of `pandas`, `scikit-learn`, and other powerful and robustly-developed Python data science packages. Interacting with such tools simply requires referencing the relevant DataFrame attributes of your GCToo instance; here, we'll demonstrate how to do some basic arithmetic and grouping tasks on components of a GCToo instance. It should go without saying that the examples below are common but also fairly trivial examples of the wide functionality that libraries like pandas and sci-kit learn provide. \n",
    "\n",
    "Another `pandas` functionality that is likely to be of use is its `groupby` tools; as long as your data/annotations aren't too big, it can work nicely with your GCToo instance's `multi_index_df`.\n",
    "\n",
    "### Column/row-wise means\n",
    "\n",
    "Let's go back to our vorinostat-treated A375 cells. What is the mean expression across all samples? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cid\n",
       "LPROT003_A375_6H:P08    0.057203\n",
       "LPROT003_A375_6H:P10    0.128851\n",
       "LPROT003_A375_6H:P12    0.532979\n",
       "LJP007_A375_24H:A03     0.622918\n",
       "LJP008_A375_24H:G07     0.068805\n",
       "LJP008_A375_24H:G08    -0.100531\n",
       "LJP008_A375_24H:G09     0.012339\n",
       "LJP008_A375_24H:G10    -0.228747\n",
       "LJP008_A375_24H:G11    -0.034701\n",
       "LJP008_A375_24H:G12    -0.113891\n",
       "LJP008_A375_24H:A03     0.167949\n",
       "LJP009_A375_24H:A03     0.351806\n",
       "LPROT001_A375_6H:P07    0.163962\n",
       "LPROT001_A375_6H:P09   -0.199321\n",
       "LPROT001_A375_6H:P11    0.028832\n",
       "LPROT002_A375_6H:P07   -0.050950\n",
       "LPROT002_A375_6H:P09    0.146417\n",
       "LPROT002_A375_6H:P11    0.150106\n",
       "dtype: float32"
      ]
     },
     "execution_count": 102,
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "import pandas as pd \n",
    "\n",
    "vorinostat_a375_gctoo.data_df.mean(axis = 0) #easy-peasy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we wanted to determine the mean expression across all samples for individual genes, we would set axis=1. \n",
    "\n",
    "### Pairwise correlation of columns \n",
    "\n",
    "How correlated are our samples? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cid</th>\n",
       "      <th>LPROT003_A375_6H:P08</th>\n",
       "      <th>LPROT003_A375_6H:P10</th>\n",
       "      <th>LPROT003_A375_6H:P12</th>\n",
       "      <th>LJP007_A375_24H:A03</th>\n",
       "      <th>LJP008_A375_24H:G07</th>\n",
       "      <th>LJP008_A375_24H:G08</th>\n",
       "      <th>LJP008_A375_24H:G09</th>\n",
       "      <th>LJP008_A375_24H:G10</th>\n",
       "      <th>LJP008_A375_24H:G11</th>\n",
       "      <th>LJP008_A375_24H:G12</th>\n",
       "      <th>LJP008_A375_24H:A03</th>\n",
       "      <th>LJP009_A375_24H:A03</th>\n",
       "      <th>LPROT001_A375_6H:P07</th>\n",
       "      <th>LPROT001_A375_6H:P09</th>\n",
       "      <th>LPROT001_A375_6H:P11</th>\n",
       "      <th>LPROT002_A375_6H:P07</th>\n",
       "      <th>LPROT002_A375_6H:P09</th>\n",
       "      <th>LPROT002_A375_6H:P11</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>LPROT003_A375_6H:P08</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.490662</td>\n",
       "      <td>0.532542</td>\n",
       "      <td>0.389154</td>\n",
       "      <td>0.320056</td>\n",
       "      <td>0.112311</td>\n",
       "      <td>-0.054310</td>\n",
       "      <td>-0.264264</td>\n",
       "      <td>-0.017371</td>\n",
       "      <td>-0.216171</td>\n",
       "      <td>0.224702</td>\n",
       "      <td>0.289866</td>\n",
       "      <td>0.259601</td>\n",
       "      <td>0.138528</td>\n",
       "      <td>0.301235</td>\n",
       "      <td>0.330139</td>\n",
       "      <td>0.479861</td>\n",
       "      <td>0.338621</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LPROT003_A375_6H:P10</th>\n",
       "      <td>0.490662</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.525302</td>\n",
       "      <td>0.419269</td>\n",
       "      <td>0.393848</td>\n",
       "      <td>0.122997</td>\n",
       "      <td>-0.049637</td>\n",
       "      <td>-0.235931</td>\n",
       "      <td>-0.097678</td>\n",
       "      <td>-0.251152</td>\n",
       "      <td>0.270517</td>\n",
       "      <td>0.334858</td>\n",
       "      <td>0.271433</td>\n",
       "      <td>0.161902</td>\n",
       "      <td>0.292011</td>\n",
       "      <td>0.343693</td>\n",
       "      <td>0.482537</td>\n",
       "      <td>0.436149</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LPROT003_A375_6H:P12</th>\n",
       "      <td>0.532542</td>\n",
       "      <td>0.525302</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.481375</td>\n",
       "      <td>0.284347</td>\n",
       "      <td>-0.064143</td>\n",
       "      <td>-0.093113</td>\n",
       "      <td>-0.440806</td>\n",
       "      <td>-0.040237</td>\n",
       "      <td>-0.379225</td>\n",
       "      <td>0.207452</td>\n",
       "      <td>0.349956</td>\n",
       "      <td>0.268879</td>\n",
       "      <td>0.035311</td>\n",
       "      <td>0.330700</td>\n",
       "      <td>0.217021</td>\n",
       "      <td>0.428786</td>\n",
       "      <td>0.359212</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LJP007_A375_24H:A03</th>\n",
       "      <td>0.389154</td>\n",
       "      <td>0.419269</td>\n",
       "      <td>0.481375</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.749817</td>\n",
       "      <td>0.065044</td>\n",
       "      <td>-0.160676</td>\n",
       "      <td>-0.324362</td>\n",
       "      <td>-0.159517</td>\n",
       "      <td>-0.358513</td>\n",
       "      <td>0.701374</td>\n",
       "      <td>0.879317</td>\n",
       "      <td>0.187186</td>\n",
       "      <td>0.074630</td>\n",
       "      <td>0.211691</td>\n",
       "      <td>0.274204</td>\n",
       "      <td>0.362895</td>\n",
       "      <td>0.332583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LJP008_A375_24H:G07</th>\n",
       "      <td>0.320056</td>\n",
       "      <td>0.393848</td>\n",
       "      <td>0.284347</td>\n",
       "      <td>0.749817</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.260146</td>\n",
       "      <td>-0.069691</td>\n",
       "      <td>-0.129586</td>\n",
       "      <td>-0.174882</td>\n",
       "      <td>-0.182362</td>\n",
       "      <td>0.708696</td>\n",
       "      <td>0.720299</td>\n",
       "      <td>0.173727</td>\n",
       "      <td>0.199501</td>\n",
       "      <td>0.187436</td>\n",
       "      <td>0.355938</td>\n",
       "      <td>0.382282</td>\n",
       "      <td>0.383166</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "output_type": "execute_result",
     "metadata": {}
    }
   ],
   "source": [
    "vorinostat_a375_cors = vorinostat_a375_gctoo.data_df.corr()\n",
    "vorinostat_a375_cors[0:5] #only showing first 5 rows"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"plotting\"></a>\n",
    "## Plotting with GCToo instances \n",
    "\n",
    "Because the attributes of a GCToo instance are pandas DataFrames, you can use any plotting libraries compatible with pandas DataFrames to generate plots; we frequently use [seaborn](https://seaborn.pydata.org/) and [matplotlib](https://matplotlib.org/). For simple plots, pandas also provides built-in plotting functionality for DataFrame objects.  \n",
    "\n",
    "As an illustrative example, we calculate the correlations across samples again, but this time also plot it as a heatmap--all in one!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\ndMN6AAAAAElFTkSuQmCC\n"
     },
     "output_type": "display_data",
     "metadata": {}
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "sns.set()\n",
    "\n",
    "\n",
    "sns.heatmap(vorinostat_a375_gctoo.data_df.corr(), cmap='plasma')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"writing\"></a>\n",
    "## Writing GCToo instances to file \n",
    "\n",
    "Here's how you would write your GCToo instance as a .gctx; note that if you'd like to write to .gct, the syntax is identical but you need to import ``write_gct`` instead. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [],
   "source": [
    "import cmapPy.pandasGEXpress.write_gctx as wg\n",
    "\n",
    "# write GCToo instance to .gctx\n",
    "wg.write(belinostat_a375_gctoo, \"belinostat_a375\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=\"converting\"></a>\n",
    "## Converting .gct <-> .gctx \n",
    "\n",
    "Converting from a gct to a gctx might be useful if you have a large gct and want faster IO in the future. We provide the following command line tools to do so: \n",
    "\n",
    "* `gct2gctx`\n",
    "* `gctx2gct`\n",
    "\n",
    "**To write some_thing.gct -> some_thing.gctx:**\n",
    "\n",
    "gct2gctx -filename path/to/in_name.gct -output_filepath /path/to/out_name\n",
    "\n",
    "Converting a gctx to a gct might be useful if you want to look at your .gctx file in a text editor or something similar. \n",
    "\n",
    "**To write some_thing.gctx -> some_thing.gct in working directory:**\n",
    "\n",
    "gctx2gct -filename path/to/in_name.gctx -output_filepath /path/to/out_name\n"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2.0
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}